/**
 * 全局生效的中间件
 * 客户端发起的任何请求，到达服务器之后，都会触发的中间件，叫做全局生效的中间件。
 * 通过调用app.use（中间件函数）,即可定义一个全局生效的中间件
 * 
 * 中间件的使用：
 * 多个中间件之间，共享同一份req,res，基于这样的特性，我们可以在上游的中间件中，统一为req,res对象添加
 * 自定义的属性或者方法，供下游的中间件或路由进行使用
 * 
 * 定义多个全局中间件
 * 可以使用app.use()连续定义多个全局中间件。客户端请求到达服务器之后，会按照中间件定义的先后顺序依次进行调用
 * 
 * 局部生效的中间件
 * 不适用ap.use()定义的中间件，叫做局部生效的中间件，如下
 * app.get('/',wm,function(){})
 * 定义多个局部中间件
 * app.get('/',wm1,wm2,wm3,function(){})
 * app.get('/',[wm1,wm2,wm3],function(){})
 * 
 * 中间件的5个使用注意事项
 * 1、一定要在路由之间注册中间件
 * 2、客户端发送过来的请求，可以连续调用多个中间件进行处理
 * 3、执行完中间件的业务代码之后，不要忘记调用next()函数
 * 4、为了防止代码逻辑混乱，调用next()函数之后不要再写额外的代码
 * 5、联系调用多个中间件时，多个中间件之间，共享req,res
 */

// 定义一个简单的全局中间件
const express = require('express');
const app = express();


// 定义一个简单的中间件
const mw = function(req,res,next){
  console.log('这是第一个中间件')
  // 获取路由请求的时间
  const time = new Date()
  req.startTime = time;
  next()
}
const mw1 = function(req,res,next){
  console.log('这是第2个中间件')
  // 获取路由请求的时间
  const time1 = new Date()
  req.startTime1 = time1;
  next()
}

const mw2 = function(req,res,next){
  console.log('这是第3个中间件')
  // 获取路由请求的时间
  const time2 = new Date()
  req.startTime2 = time2;
  next()
}


app.use(mw);
app.use(mw1);
app.use(mw2);

app.get('/user',(req,res)=>{
  // 共享同一封req,res
  console.log('请求里了-------',req.startTime)
  res.send('get请求')
})
app.post('/user',(req,res)=>{
  console.log('请求里了-------',req.startTime)
  res.send('post请求')
})

app.listen('80',()=>{
  console.log('服务器启动了 http://127.0.0.1')
})